#include "Controller.h"

/*
 * 后端交互层
 */

// 构造函数
Controller::Controller(QObject* parent)
    : QObject(parent),
      Serial(new SERIAL(this)),
      udpClient(new UdpBackendClient(this)),
      timer(new QTimer(this))
{
    timer->setInterval(200); // 设置间隔，单位毫秒
    connect(timer, &QTimer::timeout, this, &Controller::onTimeout); // 连接定时器信号
    timer->start(); // 启动定时器

    //接收数据
    connect(Serial, &SERIAL::ReceiveData, this, &Controller::ReceiveData);
    // processor->start();
}


// 析构函数
Controller::~Controller()
{
    if (Serial)
    {
        delete Serial; // 释放内存
        Serial = nullptr;
    }
    if (ConfigMode)
    {
        delete ConfigMode;
        ConfigMode = nullptr;
    }
    if (udpClient)
    {
        delete udpClient;
        udpClient = nullptr;
    }
}

/*
 * 绑定设置类
 */
void Controller::setConfig(Config* cfg)
{
    ConfigMode = cfg;
}

/*
 * 接收协议数据
 */
void Controller::ReceiveData(const QByteArray& data)
{
    static QByteArray buffer; //存放数据
    QString text;
    buffer.append(data);


    if (ConfigMode->ReadEncodedMode() == "UTF-8")
    {
        //转换数据给前端显示
        text = QString::fromUtf8(buffer);
        emit receiveText(text); // 发射信号给 QML 前端
    }
    else if (ConfigMode->ReadEncodedMode() == "GBK")
    {
        // Windows 下串口 GBK 数据转换成 QString
        text = QString::fromLocal8Bit(buffer);
        emit receiveText(text); // 发射信号给 QML 前端
    }
    else
    {
        //转换数据给前端显示
        text = QString::fromUtf8(buffer);
        emit receiveText(text); // 发射信号给 QML 前端
    }
    buffer.clear();
}

/*
 * 发送接收数据
 */
void Controller::SendMessage(QString& data)
{
    emit sendText(data);
}

/*
 * 更新波特率
 */
void Controller::UptateBaudRate(const QString& Str)
{
    UptateBaudRateData = Str;
    Serial->SetSerialBaudRate(UptateBaudRateData); //设置波特率
}


/*
 * 定时器
 */
void Controller::onTimeout()
{
    //扫更新扫描端口号
    ConfigMode->updateComList(scanSerialPorts(), Serial->isOpen());
    ConfigMode->isPortLost(scanSerialPorts(), this->Serial);
}


/*
 * 打开串口
 */
void Controller::openSerial()
{
    //串口保护
    if (Serial->isOpen())
    {
        qDebug() << "串口已经打开";
        return;
    }
    if (!ConfigMode)
    {
        qWarning() << "ConfigMode 未绑定";
        return;
    }
    portName = ConfigMode->ReadPortName();
    if (portName.isEmpty())
    {
        qWarning() << "端口号为空";
        return;
    }

    UptateBaudRateData = ConfigMode->ReadBaudRate();

    //串口参数设置
    Serial->setPortName(portName); //设置串口端号
    Serial->SetSerialBaudRate(UptateBaudRateData); //设置波特率
    Serial->SetSerialDataBits(ConfigMode->ReadDataBits()); //设置数据位
    Serial->SetSerialFlowControl(ConfigMode->ReadControl()); //设置数据流控
    Serial->SetSerialStopBits(ConfigMode->ReadStopBits()); //设置停止位
    Serial->SetSerialParity(ConfigMode->ReadParity()); //设置校验位

    //检查串口是否打开成功
    if (Serial->openPort())
    {
        ConfigMode->setConnectionOpened(true);
    }
    else
    {
        ConfigMode->setSerialError(Serial->openErrorString());
        ConfigMode->setConnectionOpened(false);
    }
}


/*
 * 关闭串口
 */
void Controller::closeSerial()
{
    Serial->SetSerialClose();
    ConfigMode->setConnectionOpened(false);
}

/*
 * 获取串口列表
 */
QStringList Controller::scanSerialPorts() const
{
    return SERIAL::scanPorts(); // 调用内部 SERIAL 类的函数
}

/*
 * 获取当前端口描述
 */
QString Controller::currentPortDescription() const
{
    return Serial->currentPortDescription();
}

/*
 *设置端口名字
 */
void Controller::setPortName(const QString& name)
{
    Serial->setPortName(name);
    qDebug() << "后端端口" << name;
}

/*
 * 发送字符串
 */
void Controller::sendString(QString str)
{
    if (!Serial->isOpen())
    {
        qDebug() << "串口未打开";
        return;
    }


    if (str.isEmpty())
    {
        qDebug() << "输入为空";
        return;
    }

    QString str_tmp;
    for (auto c : str)
    {
        if (c == '\r' || c == '\n')
        {
            break;
        }
        str_tmp += c;
    }
    Serial->SendData(str_tmp);
    SendMessage(str_tmp);
}

/*
 * 发送16进制字符串
 */

void Controller::sendHex(QString str)
{
    if (!Serial->isOpen())
    {
        qDebug() << "串口未打开";
        return;
    }

    // --- 1. 格式化输入 ---
    str = str.trimmed().toUpper();
    str.replace("0X", ""); // 去掉可能的 "0x"
    str.replace(" ", ""); // 去掉空格

    if (str.isEmpty())
    {
        qDebug() << "输入为空";
        return;
    }
    // --- 2. 字符串转字节流 ---
    QByteArray data;
    bool ok;
    for (int i = 0; i < str.length(); i += 2)
    {
        QString byteStr = str.mid(i, 2);
        char byte = static_cast<char>(byteStr.toUInt(&ok, 16));
        if (!ok)
        {
            qDebug() << "十六进制格式错误:" << byteStr;
            return;
        }
        data.append(byte);
    }
    // --- 3. 调用底层发送 ---
    Serial->SendData(data); // 注意：要改 SendData 重载版本
    QString str_tmp = QString(data);
    SendMessage(str_tmp);
    qDebug() << "发送十六进制数据:" << data.toHex(' ').toUpper();
}


/*
 * 打开UDP
 */
void Controller::openUdp()
{
    if (!udpClient) return;
    if (udpClient->Udp_IsOpen()) return;

    if (udpClient->Udp_Init(ConfigMode->ReadLocalPort().toUShort()))
    {
        ConfigMode->setConnectionOpened(true);
        qDebug() << "UDP打开成功";
    }
    else
    {
        ConfigMode->setConnectionOpened(false);

        qDebug() << "UDP打开失败";
    }
}

/*
 * 关闭UDP
 */

void Controller::closeUdp()
{
    if (!udpClient) return;
    if (!udpClient->Udp_IsOpen()) return;

    udpClient->Udp_Close(); // 调用底层关闭函数
    ConfigMode->setConnectionOpened(false); // 更新UI状态
    qDebug() << "UDP已关闭";
}
